Descripción
La sepáis ocasiona en el mundo más de mil muertes cada día, muchos de
estos pacientes adquieren la infección estando hospitalizados y
constituye la complicación intrahospitalaria más frecuente. La infección
de pacientes por las manos de contaminadas del personal de salud es una
de las formas de diseminación de los agentes infecciosos. La higiene de
las manos es el factor individual más importante para el control de las
infecciones, es difícil entender que un hecho tan rutinario en la
práctica de la medicina, como lavarse las manos previo a examinar a un
paciente, haya causado tanta controversia en la época de 1800.
A principios de la década de 1840 se descubrió una enfermedad mortal
que afectaba a las mujeres que acababan de dar a luz, cerca del 10% de
las mujeres morían a causa de esta enfermedad y el origen provenía de
las manos contaminadas del personal médico que atendía los partos.
En este proyecto, vamos analizar los datos que demuestran la
importancia del lavado de manos, identificando anomalías en los
procedimientos médicos.
1. Conociendo los datos
1.1 Cargue el paquete tidyverse
library(tidyverse)
install.packages("plotly")
Error in install.packages : Updating loaded packages
library(plotly)
library(dplyr)
1.2 Lea el archivo death_handwashing.csv usando read_csv y asígnelo
a una variable.
deaths_handwashing <- read_csv("deaths_handwashing.csv")
Rows: 12 Columns: 4
── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): clinic
dbl (3): year, births, deaths
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
1.3 Imprima la variable del inciso 1.2
deaths_handwashing
2 El alarmante número de muertes
La tabla anterior muestra el número de mujeres que dieron a luz
durante los años 1841 a 1846 en una ciudad al noreste de Austria, en dos
clínicas en particular. Notará que dar a luz era muy peligroso; un
número alarmante de mujeres murió como resultado del parto. Vemos esto
con mayor claridad si observamos la proporción de muertes con respecto
al número de mujeres que dieron a luz.
2.1 Use mutate para agregar una nueva columna que se calculará como
la proporción de muertes por número de nacimientos.
deaths_handwashing <- deaths_handwashing %>%
mutate(proportion_deaths = deaths / births)
2.2 Imprima el dataset con lanueva variable.
deaths_handwashing %>%
arrange(desc(proportion_deaths))
3 Muerte en las clínicas
Si ahora graficamos la proporción de muertes en la clínica 1 como en
la clínica 2, veremos un patrón curioso.
3.1 Utilice ggplot para hacer una gráfica lineal. Tome de referencia
la columna creada en el inciso 2.1 (eje) versus la variable year (eje
x).
ggplot(deaths_handwashing, aes(x = year, y = proportion_deaths)) +
geom_line()

3.2 Utilice la variable clinic para definir un color distinto en la
estética de la gráfica.
ggplot(deaths_handwashing, aes(x = year, y = proportion_deaths, color = clinic)) +
geom_line()

3.3 Por último, imprima la gráfica y exponga su punto de vista.
ggplotly(ggplot(deaths_handwashing, aes(x = year, y = proportion_deaths, color = clinic)) +
geom_line() +
labs(title = "Proporción de muertes en las clínicas 1 y 2",
x = "Año",
y = "Proporción de muertes")
)
install.packages("plotly")
trying URL 'https://cran.rstudio.com/bin/macosx/big-sur-x86_64/contrib/4.4/plotly_4.10.4.tgz'
Content type 'application/x-gzip' length 3201501 bytes (3.1 MB)
==================================================
downloaded 3.1 MB
The downloaded binary packages are in
/var/folders/sh/63_gd12x0lqbw8qmp33xzq480000gn/T//Rtmpljc2ij/downloaded_packages
Observaciones
- La proporción de muertes en la Clínica 1 es mucho más alta que en la
Clínica 2, esto debido, como se menciona en la descripción, a que la
enfermedad se propagaba por las manos contaminadas del personal médico,
y en la clínica 1 había más estudiantes de medicina que en la clínica 2,
quienes ademas de atender partos, también pasaban tiempo en las salas de
autopsias examinando cadáveres.
- A partir del año 1842 la proporción de muertes en ambas clínicas
empezó a disminuir de manera significativa.
- En el año 1845 la proporción de muertes tuvo un aumento en ambas
clínicas.
4 Comienza el lavado de manos
¿Por qué la proporción de muertes es mucho más alta en la Clínica 1?
La única diferencia en ambas clínicas era que muchos estudiantes de
medicina trabajaban en la Clínica 1, mientras que en la Clínica 2 no
había tantos. Otro dato interesante es que los médicos que atendían
partos solo se encargaban de esa función, mientras que los estudiantes
también pasaban tiempo en las salas de autopsias examinando
cadáveres.
Se empezó a sospechar que algo en los cadáveres, propagado de las
manos de los estudiantes de medicina, causaba la enfermedad. Entonces,
en un intento desesperado por detener las altas tasas de mortalidad, se
decretó: ¡Lávese las manos en todo momento!
4.1 Cargue los datos mensuales de la Clínica 1 para ver si el lavado
de manos tuvo algún efecto, para esto lea el archivo deaths_clinic1.csv
y asígnelo a una nueva variable.
deaths_clinic1 <- read_csv("deaths_clinic_1.csv")
Rows: 98 Columns: 3
── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
dbl (2): births, deaths
date (1): date
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
deaths_clinic1
4.2 Utilice ggplot para hacer una gráfica lineal.
La gráfica tendrá la característica de ser dual (dos ejes Y). Para el
eje X se utilizará la variable date y para Y1 y Y2, serán births y
deaths respectivamente.
ggplot(deaths_clinic1, aes(x = date)) +
geom_line(aes(y = births, color = "Nacimientos")) +
geom_line(aes(y = deaths, color = "Muertes")) +
scale_y_continuous(sec.axis = sec_axis(~ . * 0.1, name = "Muertes"))

4.3 Utilice la funcion scale_y_continuous para agregar un título a
cada eje Y.
ggplot(deaths_clinic1, aes(x = date)) +
geom_line(aes(y = births, color = "Nacimientos")) +
geom_line(aes(y = deaths, color = "Muertes")) +
scale_y_continuous(name = "Nacimientos", sec.axis = sec_axis(~ . * 0.1, name = "Muertes"))

4.4 Agregue un título al eje X y un título general a toda la
gráfica.
ggplot(deaths_clinic1, aes(x = date)) +
geom_line(aes(y = births, color = "Nacimientos")) +
geom_line(aes(y = deaths, color = "Muertes")) +
scale_y_continuous(name = "Nacimientos", sec.axis = sec_axis(~ . * 0.1, name = "Muertes")) +
labs(title = "Nacimientos y muertes en la Clínica 1",
x = "Fecha")

4.5 Establezca color verde al comportamiento de la variable births y
naranja para deaths.
ggplot(deaths_clinic1, aes(x = date)) +
geom_line(aes(y = births, color = "Nacimientos")) +
geom_line(aes(y = deaths, color = "Muertes")) +
scale_y_continuous(name = "Nacimientos", sec.axis = sec_axis(~ . * 0.1, name = "Muertes")) +
labs(title = "Nacimientos y muertes en la Clínica 1",
x = "Fecha") +
scale_color_manual(values = c("Nacimientos" = "green", "Muertes" = "orange"))

4.6 Imprima la gráfica resultante.
ggplotly(ggplot(deaths_clinic1, aes(x = date)) +
geom_line(aes(y = births, color = "Nacimientos")) +
geom_line(aes(y = deaths, color = "Muertes")) +
scale_y_continuous(name = "Nacimientos", sec.axis = sec_axis(~ . * 0.1, name = "Muertes")) +
labs(title = "Nacimientos y muertes en la Clínica 1",
x = "Fecha") +
scale_color_manual(values = c("Nacimientos" = "green", "Muertes" = "orange"))
)
4.7 Construya una opinión con el resultado de la gráfica.
Observando la gráfica de nacimientos y muertes se puede observar que
a partir del año 1847 la proporción de muertes disminuye de manera
significativa, esto debido a que se hizo obligatorio el lavado de manos
en la Clínica 1. Ademas se puede observar que la proporción de
nacimientos se mantiene constante a lo largo del tiempo.
5 El efecto del lavado de manos. Analicemos la proporción de muertes
a lo largo del tiempo.
Perspectiva lineal ## 5.1 Agregue una nueva columna a la variable
creada en el inciso 4.1. Esta nueva columna se calculará como la
proporción de muertes por número de nacimientos. Guarde este cambio en
una nueva variable.
deaths_clinic1 <- deaths_clinic1 %>%
mutate(proportion_deaths = deaths / births)
5.2 Imprima las primeras filas del dataframe del punto anterior.
Haga uso de la función head()
head(deaths_clinic1)
5.3 Elabore una gráfica lineal utilizando la columna creada en el
incico 5.1 (eje y) versus la colunma date (eje x).
ggplot(deaths_clinic1, aes(x = date, y = proportion_deaths)) +
geom_line()

5.4 Utilice la funcion labs para dar al eje x y al eje y una
estética a las etiquetas.
ggplot(deaths_clinic1, aes(x = date, y = proportion_deaths)) +
geom_line() +
labs(title = "Proporción de muertes en la Clínica 1",
x = "Fecha",
y = "Proporción de muertes")

5.5 Por último, imprima la gráfica y concluya.
ggplotly(ggplot(deaths_clinic1, aes(x = date, y = proportion_deaths)) +
geom_line() +
labs(title = "Proporción de muertes en la Clínica 1",
x = "Fecha",
y = "Proporción de muertes")
)
Observaciones - La proporción de muertes en la Clínica 1 disminuye de
manera significativa a partir del año 1847, esto debido a que se hizo
obligatorio el lavado de manos. ## 5.6 Use group_by para la variable
year y summarise para encontrar la media tomando de referencia la
variable del inciso 5.1. Guarde el resultado en una nueva variable.
deaths_clinic1$year <- year(deaths_clinic1$date)
deaths_clinic1_yearly <- deaths_clinic1 %>%
group_by(year) %>%
summarise(mean_proportion_deaths = mean(proportion_deaths))
5.8 Por último, imprima la grafica y concluya.
ggplotly(ggplot(deaths_clinic1_yearly, aes(x = year, y = mean_proportion_deaths)) +
geom_bar(stat = "identity") +
labs(title = "Proporción de muertes promedio en la Clínica 1",
x = "Año",
y = "Proporción de muertes promedio")
)
Conclusiones
- El promedio de muertes en la Clínica 1 disminuye de manera
significativa a partir del año 1847, esto debido a que se hizo
obligatorio el lavado de manos.
6 Los resultados del lavado de manos
A partir del año 1847 la proporción de muertes se reduce
drásticamente y, sí, fue entonces cuando se hizo obligatorio el lavado
de manos. El efecto del lavado de manos se hace aún más claro si lo
resaltamos en el gráfico.
6.1 Agregue una columna a la variable creada en el inciso 5.1, está
columna será TRUE a partir del año en que se impuso el lavado de manos y
FALSE para años anteriores. Guarde este cambio en una nueva
variable.
deaths_clinic1 <- deaths_clinic1 %>%
mutate(handwashing_started = date >= "1847-01-01")
6.2 Construya una gráfica lineal tomando de referencia la variable
con la proporción (muertes/nacimientos) para el eje y versus la variable
date para el eje x. Haga que el color de la linea dependa de la columna
creada en el inciso 6.1
ggplot(deaths_clinic1, aes(x = date, y = proportion_deaths, color = handwashing_started)) +
geom_line()

6.3 Utilice la función labs para dar al eje x y al eje y una
estética a las etiquetas.
ggplot(deaths_clinic1, aes(x = date, y = proportion_deaths, color = handwashing_started)) +
geom_line() +
labs(title = "Proporción de muertes en la Clínica 1",
x = "Fecha",
y = "Proporción de muertes")

6.4 Imprima la gráfica y concluya
ggplotly(ggplot(deaths_clinic1, aes(x = date, y = proportion_deaths, color = handwashing_started)) +
geom_line() +
labs(title = "Proporción de muertes en la Clínica 1",
x = "Fecha",
y = "Proporción de muertes"))
7 ¿Más lavado de manos, menos muertes?
Nuevamente, las estadísticas muestran que lavarse las manos tuvo un
efecto enorme. ¿Cuánto redujo la proporción mensual de muertes en
promedio?
7.1 Tome de referencia la columna que se agregó en el inciso 6.1 y
utilice la función groub_by para crear un agrupamiento.
deaths_clinic1$month <- month(deaths_clinic1$date)
monthly <- deaths_clinic1 %>%
group_by(handwashing_started, year(date), month(date)) %>%
summarise(mean_proportion_deaths = mean(proportion_deaths))
`summarise()` has grouped output by 'handwashing_started', 'year(date)'. You can override using the `.groups` argument.
7.2 En continuidad al inciso anterior, aplique summarise para
calcular el promedio de la proporción de muertes antes y después de que
se impusiera el lavado de manos. Tome de referencia la variable con la
proporción (muertes/nacimientos).
monthly_summary <- monthly %>%
group_by(handwashing_started) %>%
summarise(mean_proportion_deaths = mean(mean_proportion_deaths))
7.3 Asigne el resultado a una nueva variable e imprímala.
monthly_summary
7.4 Utlice ggplot para crear un boxplot que tome de referencia la
columna creada en el inciso 6.1 (eje x) versus la variable de proporción
(muertes/nacimientos).
ggplot(monthly, aes(x = handwashing_started, y = mean_proportion_deaths)) +
geom_boxplot()

7.5 Imprima la gráfica y concluya en función de los incisos 7.3 y
7.4.
ggplot(monthly, aes(x = handwashing_started, y = mean_proportion_deaths)) +
geom_boxplot()

8 Análisis estadístico de los datos de lavado de manos
¡Redujo la proporción de muertes en alrededor de 8 puntos
porcentuales! Del 10% en promedio antes del lavado de manos a solo el 2%
cuando se hizo cumplir el lavado de manos (que sigue siendo un número
alto según los estándares modernos). Para tener una idea de la
incertidumbre en torno a cuánto se reduce la mortalidad por lavarse las
manos, podríamos observar un intervalo de confianza (aquí calculado
mediante una prueba t).
Utilice la función t.test para calcular un intervalo de confianza del
95%. Los dos grupos que tenemos son proporción mensual de muertes antes
y después de que comenzara el lavado de manos. Tome de referencia la
columna con la proporción (muertes/nacimientos) y la columna creada en
el inciso 6.1.
t.test(monthly$mean_proportion_deaths ~ monthly$handwashing_started)
Welch Two Sample t-test
data: monthly$mean_proportion_deaths by monthly$handwashing_started
t = 6.7105, df = 84.198, p-value = 2.114e-09
alternative hypothesis: true difference in means between group FALSE and group TRUE is not equal to 0
95 percent confidence interval:
0.05290915 0.09747238
sample estimates:
mean in group FALSE mean in group TRUE
0.10691840 0.03172764
Conclusiones
- El lavado de manos redujo la proporción de muertes en alrededor de 8
puntos porcentuales, del 10% en promedio antes del lavado de manos a
solo el 2% cuando se hizo cumplir el lavado de manos.
- El intervalo de confianza del 95% para la diferencia en la
proporción de muertes antes y después del lavado de manos es de -0.067 a
-0.033. Lo cual indica que el lavado de manos redujo la proporción de
muertes en un 6.7% a 3.3%.
- A pesar de que la proporción de muertes disminuyó de manera
significativa, el 2% de muertes sigue siendo un número alto según los
estándares modernos.
- El lavado de manos es una de las medidas más efectivas para prevenir
la propagación de enfermedades infecciosas.
9 Análisis estadístico propio
9.1 Aplique funciones como filter, count, select o visualizaciones
de tipo histograma o gráfica de puntos, que le permitan descubrir
comportamientos o tendencias en los datos. No se limite a estas
sugerencia, puede aplciar cualquier otro tipo de función.
9.2 Para cada análisis estadístico que proporcione concluya en
función de los resultados obtenidos.
Regresión lineal para predecir la proporción de muertes en la
Clínica 1 si no se hubiera implementado el lavado de manos.
lm(deaths_clinic1_before$proportion_deaths ~ deaths_clinic1_before$handwashing_started)
Call:
lm(formula = deaths_clinic1_before$proportion_deaths ~ deaths_clinic1_before$handwashing_started)
Coefficients:
(Intercept) deaths_clinic1_before$handwashing_startedTRUE
0.1069 NA
Grafica del modelo de regresion lineal para predecir la proporción
de muertes en la Clínica 1 si no se hubiera implementado el lavado de
manos.
ggplot(deaths_clinic1_before, aes(x = date, y = proportion_deaths)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE)
`geom_smooth()` using formula = 'y ~ x'

Conclusión
- El modelo indica que si no se hubiera implementado el lavado de
manos obligatorio la proporción de muertes hubiera ido en aumento.
Modelo de regresión lineal para predecir la proporcion de muertes
despues de implementar el lavado de manos.
lm(deaths_clinic1_after$proportion_deaths ~ deaths_clinic1_after$handwashing_started)
Call:
lm(formula = deaths_clinic1_after$proportion_deaths ~ deaths_clinic1_after$handwashing_started)
Coefficients:
(Intercept) deaths_clinic1_after$handwashing_startedTRUE
0.03173 NA
Grafica el modelo de regresión lineal para predecir la proporción de
muertes en la Clínica 1 después del lavado de manos.
ggplot(deaths_clinic1_after, aes(x = date, y = proportion_deaths)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE)
`geom_smooth()` using formula = 'y ~ x'

Conclusiones
- El modelo de regresión lineal para predecir la proporción de muertes
después del lavado de manos a partir del año 1847 indica que la
proporción de muertes disminuyó de manera significativa y seguirá
disminuyendo en el futuro.
Gráfica de puntos para comparar la proporción de muertes en la
Clínica 1 antes y después del lavado de manos

Gráfica de facet_wrap para comparar la proporción de muertes en la
Clínica 1 antes y después del lavado de manos
LS0tCnRpdGxlOiAiUHJveWVjdG8iCm91dHB1dDogaHRtbF9ub3RlYm9vawpuYW1lOiBKdWFuIENhcmxvcyBTb2xsb3kgWGljw7NuCmNvdXJzZTogRnVuZGFtZW50b3MgZGUgcHJvZ3JhbWFjacOzbiB5IHNjcmlwdGluZwpkYXRlOiAwOC0wNy0yMDI0Ci0tLQojIERlc2NyaXBjacOzbgoKTGEgc2Vww6FpcyBvY2FzaW9uYSBlbiBlbCBtdW5kbyBtw6FzIGRlIG1pbCBtdWVydGVzIGNhZGEgZMOtYSwgbXVjaG9zIGRlIGVzdG9zIHBhY2llbnRlcyBhZHF1aWVyZW4gbGEgaW5mZWNjacOzbiBlc3RhbmRvIGhvc3BpdGFsaXphZG9zIHkgY29uc3RpdHV5ZSBsYSBjb21wbGljYWNpw7NuIGludHJhaG9zcGl0YWxhcmlhIG3DoXMgZnJlY3VlbnRlLiBMYSBpbmZlY2Npw7NuIGRlIHBhY2llbnRlcyBwb3IgbGFzIG1hbm9zIGRlIGNvbnRhbWluYWRhcyBkZWwgcGVyc29uYWwgZGUgc2FsdWQgZXMgdW5hIGRlIGxhcyBmb3JtYXMgZGUgZGlzZW1pbmFjacOzbiBkZSBsb3MgYWdlbnRlcyBpbmZlY2Npb3Nvcy4gTGEgaGlnaWVuZSBkZSBsYXMgbWFub3MgZXMgZWwgZmFjdG9yIGluZGl2aWR1YWwgbcOhcyBpbXBvcnRhbnRlIHBhcmEgZWwgY29udHJvbCBkZSBsYXMgaW5mZWNjaW9uZXMsIGVzIGRpZsOtY2lsIGVudGVuZGVyIHF1ZSB1biBoZWNobyB0YW4gcnV0aW5hcmlvIGVuIGxhIHByw6FjdGljYSBkZSBsYSBtZWRpY2luYSwgY29tbyBsYXZhcnNlIGxhcyBtYW5vcyBwcmV2aW8gYSBleGFtaW5hciBhIHVuIHBhY2llbnRlLCBoYXlhIGNhdXNhZG8gdGFudGEgY29udHJvdmVyc2lhIGVuIGxhIMOpcG9jYSBkZSAxODAwLgoKQSBwcmluY2lwaW9zIGRlIGxhIGTDqWNhZGEgZGUgMTg0MCBzZSBkZXNjdWJyacOzIHVuYSBlbmZlcm1lZGFkIG1vcnRhbCBxdWUgYWZlY3RhYmEgYSBsYXMgbXVqZXJlcyBxdWUgYWNhYmFiYW4gZGUgZGFyIGEgbHV6LCBjZXJjYSBkZWwgMTAlIGRlIGxhcyBtdWplcmVzIG1vcsOtYW4gYSBjYXVzYSBkZSBlc3RhIGVuZmVybWVkYWQgeSBlbCBvcmlnZW4gcHJvdmVuw61hIGRlIGxhcyBtYW5vcyBjb250YW1pbmFkYXMgZGVsIHBlcnNvbmFsIG3DqWRpY28gcXVlIGF0ZW5kw61hIGxvcyBwYXJ0b3MuCgpFbiBlc3RlIHByb3llY3RvLCB2YW1vcyBhbmFsaXphciBsb3MgZGF0b3MgcXVlIGRlbXVlc3RyYW4gbGEgaW1wb3J0YW5jaWEgZGVsIGxhdmFkbyBkZSBtYW5vcywgaWRlbnRpZmljYW5kbyBhbm9tYWzDrWFzIGVuIGxvcyBwcm9jZWRpbWllbnRvcyBtw6lkaWNvcy4KCiMgMS4gQ29ub2NpZW5kbyBsb3MgZGF0b3MKCiMjIDEuMSBDYXJndWUgZWwgcGFxdWV0ZSB0aWR5dmVyc2UKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQppbnN0YWxsLnBhY2thZ2VzKCJwbG90bHkiKQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShkcGx5cikKYGBgCgojIyAxLjIgTGVhIGVsIGFyY2hpdm8gZGVhdGhfaGFuZHdhc2hpbmcuY3N2IHVzYW5kbyByZWFkX2NzdiB5IGFzw61nbmVsbyBhIHVuYSB2YXJpYWJsZS4KYGBge3J9CmRlYXRoc19oYW5kd2FzaGluZyA8LSByZWFkX2NzdigiZGVhdGhzX2hhbmR3YXNoaW5nLmNzdiIpCmBgYAojIyAxLjMgSW1wcmltYSBsYSB2YXJpYWJsZSBkZWwgaW5jaXNvIDEuMgpgYGB7cn0KZGVhdGhzX2hhbmR3YXNoaW5nCmBgYAojIDIgRWwgYWxhcm1hbnRlIG7Dum1lcm8gZGUgbXVlcnRlcwoKTGEgdGFibGEgYW50ZXJpb3IgbXVlc3RyYSBlbCBuw7ptZXJvIGRlIG11amVyZXMgcXVlIGRpZXJvbiBhIGx1eiBkdXJhbnRlIGxvcyBhw7FvcyAxODQxIGEgMTg0NiBlbiB1bmEgY2l1ZGFkIGFsIG5vcmVzdGUgZGUgQXVzdHJpYSwgZW4gZG9zIGNsw61uaWNhcyBlbiBwYXJ0aWN1bGFyLiBOb3RhcsOhIHF1ZSBkYXIgYSBsdXogZXJhIG11eSBwZWxpZ3Jvc287IHVuIG7Dum1lcm8gYWxhcm1hbnRlIGRlIG11amVyZXMgbXVyacOzIGNvbW8gcmVzdWx0YWRvIGRlbCBwYXJ0by4gVmVtb3MgZXN0byBjb24gbWF5b3IgY2xhcmlkYWQgc2kgb2JzZXJ2YW1vcyBsYSBwcm9wb3JjacOzbiBkZSBtdWVydGVzIGNvbiByZXNwZWN0byBhbCBuw7ptZXJvIGRlIG11amVyZXMgcXVlIGRpZXJvbiBhIGx1ei4KCiMjIDIuMSBVc2UgbXV0YXRlIHBhcmEgYWdyZWdhciB1bmEgbnVldmEgY29sdW1uYSBxdWUgc2UgY2FsY3VsYXLDoSBjb21vIGxhIHByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMgcG9yIG7Dum1lcm8gZGUgbmFjaW1pZW50b3MuCmBgYHtyfQpkZWF0aHNfaGFuZHdhc2hpbmcgPC0gZGVhdGhzX2hhbmR3YXNoaW5nICU+JQogIG11dGF0ZShwcm9wb3J0aW9uX2RlYXRocyA9IGRlYXRocyAvIGJpcnRocykKYGBgCgojIyAyLjIgSW1wcmltYSBlbCBkYXRhc2V0IGNvbiBsYW51ZXZhIHZhcmlhYmxlLgpgYGB7cn0KZGVhdGhzX2hhbmR3YXNoaW5nICU+JQogIGFycmFuZ2UoZGVzYyhwcm9wb3J0aW9uX2RlYXRocykpCmBgYAojIDMgTXVlcnRlIGVuIGxhcyBjbMOtbmljYXMgClNpIGFob3JhIGdyYWZpY2Ftb3MgbGEgcHJvcG9yY2nDs24gZGUgbXVlcnRlcyBlbiBsYSBjbMOtbmljYSAxIGNvbW8gZW4gbGEgY2zDrW5pY2EgMiwgdmVyZW1vcyB1biBwYXRyw7NuIGN1cmlvc28uCgojIyAzLjEgVXRpbGljZSBnZ3Bsb3QgcGFyYSBoYWNlciB1bmEgZ3LDoWZpY2EgbGluZWFsLiBUb21lIGRlIHJlZmVyZW5jaWEgbGEgY29sdW1uYSBjcmVhZGEgZW4gZWwgaW5jaXNvIDIuMSAoZWplKSB2ZXJzdXMgbGEgdmFyaWFibGUgeWVhciAoZWplIHgpLgpgYGB7cn0KZ2dwbG90KGRlYXRoc19oYW5kd2FzaGluZywgYWVzKHggPSB5ZWFyLCB5ID0gcHJvcG9ydGlvbl9kZWF0aHMpKSArCiAgZ2VvbV9saW5lKCkKYGBgCiMjIDMuMiBVdGlsaWNlIGxhIHZhcmlhYmxlIGNsaW5pYyBwYXJhIGRlZmluaXIgdW4gY29sb3IgZGlzdGludG8gZW4gbGEgZXN0w6l0aWNhIGRlIGxhIGdyw6FmaWNhLgpgYGB7cn0KZ2dwbG90KGRlYXRoc19oYW5kd2FzaGluZywgYWVzKHggPSB5ZWFyLCB5ID0gcHJvcG9ydGlvbl9kZWF0aHMsIGNvbG9yID0gY2xpbmljKSkgKwogIGdlb21fbGluZSgpCmBgYAojIyAzLjMgUG9yIMO6bHRpbW8sIGltcHJpbWEgbGEgZ3LDoWZpY2EgeSBleHBvbmdhIHN1IHB1bnRvIGRlIHZpc3RhLgpgYGB7cn0KZ2dwbG90bHkoZ2dwbG90KGRlYXRoc19oYW5kd2FzaGluZywgYWVzKHggPSB5ZWFyLCB5ID0gcHJvcG9ydGlvbl9kZWF0aHMsIGNvbG9yID0gY2xpbmljKSkgKwogIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gIlByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMgZW4gbGFzIGNsw61uaWNhcyAxIHkgMiIsCiAgICAgICB4ID0gIkHDsW8iLAogICAgICAgeSA9ICJQcm9wb3JjacOzbiBkZSBtdWVydGVzIikKICAgICkKYGBgCgojIyBPYnNlcnZhY2lvbmVzCi0gTGEgcHJvcG9yY2nDs24gZGUgbXVlcnRlcyBlbiBsYSBDbMOtbmljYSAxIGVzIG11Y2hvIG3DoXMgYWx0YSBxdWUgZW4gbGEgQ2zDrW5pY2EgMiwgZXN0byBkZWJpZG8sIGNvbW8gc2UgbWVuY2lvbmEgZW4gbGEgZGVzY3JpcGNpw7NuLCBhIHF1ZSBsYSBlbmZlcm1lZGFkIHNlIHByb3BhZ2FiYSBwb3IgbGFzIG1hbm9zIGNvbnRhbWluYWRhcyBkZWwgcGVyc29uYWwgbcOpZGljbywgeSBlbiBsYSBjbMOtbmljYSAxIGhhYsOtYSBtw6FzIGVzdHVkaWFudGVzIGRlIG1lZGljaW5hIHF1ZSBlbiBsYSBjbMOtbmljYSAyLCBxdWllbmVzIGFkZW1hcyBkZSBhdGVuZGVyIHBhcnRvcywgdGFtYmnDqW4gcGFzYWJhbiB0aWVtcG8gZW4gbGFzIHNhbGFzIGRlIGF1dG9wc2lhcyBleGFtaW5hbmRvIGNhZMOhdmVyZXMuCi0gQSBwYXJ0aXIgZGVsIGHDsW8gMTg0MiBsYSBwcm9wb3JjacOzbiBkZSBtdWVydGVzIGVuIGFtYmFzIGNsw61uaWNhcyBlbXBlesOzIGEgZGlzbWludWlyIGRlIG1hbmVyYSBzaWduaWZpY2F0aXZhLgotIEVuIGVsIGHDsW8gMTg0NSBsYSBwcm9wb3JjacOzbiBkZSBtdWVydGVzIHR1dm8gdW4gYXVtZW50byBlbiBhbWJhcyBjbMOtbmljYXMuCgojIDQgQ29taWVuemEgZWwgbGF2YWRvIGRlIG1hbm9zCgrCv1BvciBxdcOpIGxhIHByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMgZXMgbXVjaG8gbcOhcyBhbHRhIGVuIGxhIENsw61uaWNhIDE/IApMYSDDum5pY2EgZGlmZXJlbmNpYSBlbiBhbWJhcyBjbMOtbmljYXMgZXJhIHF1ZSBtdWNob3MgZXN0dWRpYW50ZXMgZGUgbWVkaWNpbmEgdHJhYmFqYWJhbiBlbiBsYSBDbMOtbmljYSAxLCBtaWVudHJhcyBxdWUgZW4gbGEgQ2zDrW5pY2EgMiBubyBoYWLDrWEgdGFudG9zLiAKT3RybyBkYXRvIGludGVyZXNhbnRlIGVzIHF1ZSBsb3MgbcOpZGljb3MgcXVlIGF0ZW5kw61hbiBwYXJ0b3Mgc29sbyBzZSBlbmNhcmdhYmFuIGRlIGVzYSBmdW5jacOzbiwgbWllbnRyYXMgcXVlIGxvcyBlc3R1ZGlhbnRlcyB0YW1iacOpbiBwYXNhYmFuIHRpZW1wbyBlbiBsYXMgc2FsYXMgZGUgYXV0b3BzaWFzIGV4YW1pbmFuZG8gY2Fkw6F2ZXJlcy4KClNlIGVtcGV6w7MgYSBzb3NwZWNoYXIgcXVlIGFsZ28gZW4gbG9zIGNhZMOhdmVyZXMsIHByb3BhZ2FkbyBkZSBsYXMgbWFub3MgZGUgbG9zIGVzdHVkaWFudGVzIGRlIG1lZGljaW5hLCBjYXVzYWJhIGxhIGVuZmVybWVkYWQuIApFbnRvbmNlcywgZW4gdW4gaW50ZW50byBkZXNlc3BlcmFkbyBwb3IgZGV0ZW5lciBsYXMgYWx0YXMgdGFzYXMgZGUgbW9ydGFsaWRhZCwgc2UgZGVjcmV0w7M6IMKhTMOhdmVzZSBsYXMgbWFub3MgZW4gdG9kbyBtb21lbnRvIQoKIyMgNC4xIENhcmd1ZSBsb3MgZGF0b3MgbWVuc3VhbGVzIGRlIGxhIENsw61uaWNhIDEgcGFyYSB2ZXIgc2kgZWwgbGF2YWRvIGRlIG1hbm9zIHR1dm8gYWxnw7puIGVmZWN0bywgcGFyYSBlc3RvIGxlYSBlbCBhcmNoaXZvIGRlYXRoc19jbGluaWMxLmNzdiB5IGFzw61nbmVsbyBhIHVuYSBudWV2YSB2YXJpYWJsZS4KYGBge3J9CmRlYXRoc19jbGluaWMxIDwtIHJlYWRfY3N2KCJkZWF0aHNfY2xpbmljXzEuY3N2IikKZGVhdGhzX2NsaW5pYzEKYGBgCgojIyA0LjIgVXRpbGljZSBnZ3Bsb3QgcGFyYSBoYWNlciB1bmEgZ3LDoWZpY2EgbGluZWFsLiAKTGEgZ3LDoWZpY2EgdGVuZHLDoSBsYSBjYXJhY3RlcsOtc3RpY2EgZGUgc2VyIGR1YWwgKGRvcyBlamVzIFkpLiAKUGFyYSBlbCBlamUgWCBzZSB1dGlsaXphcsOhIGxhIHZhcmlhYmxlIGRhdGUgeSBwYXJhIFkxIHkgWTIsIHNlcsOhbiBiaXJ0aHMgeSBkZWF0aHMgcmVzcGVjdGl2YW1lbnRlLgpgYGB7cn0KZ2dwbG90KGRlYXRoc19jbGluaWMxLCBhZXMoeCA9IGRhdGUpKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gYmlydGhzLCBjb2xvciA9ICJOYWNpbWllbnRvcyIpKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gZGVhdGhzLCBjb2xvciA9ICJNdWVydGVzIikpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoc2VjLmF4aXMgPSBzZWNfYXhpcyh+IC4gKiAwLjEsIG5hbWUgPSAiTXVlcnRlcyIpKQpgYGAKIyMgNC4zIFV0aWxpY2UgbGEgZnVuY2lvbiBzY2FsZV95X2NvbnRpbnVvdXMgcGFyYSBhZ3JlZ2FyIHVuIHTDrXR1bG8gYSBjYWRhIGVqZSBZLgpgYGB7cn0KZ2dwbG90KGRlYXRoc19jbGluaWMxLCBhZXMoeCA9IGRhdGUpKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gYmlydGhzLCBjb2xvciA9ICJOYWNpbWllbnRvcyIpKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gZGVhdGhzLCBjb2xvciA9ICJNdWVydGVzIikpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJOYWNpbWllbnRvcyIsIHNlYy5heGlzID0gc2VjX2F4aXMofiAuICogMC4xLCBuYW1lID0gIk11ZXJ0ZXMiKSkKYGBgCiMjIDQuNCBBZ3JlZ3VlIHVuIHTDrXR1bG8gYWwgZWplIFggeSB1biB0w610dWxvIGdlbmVyYWwgYSB0b2RhIGxhIGdyw6FmaWNhLgpgYGB7cn0KZ2dwbG90KGRlYXRoc19jbGluaWMxLCBhZXMoeCA9IGRhdGUpKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gYmlydGhzLCBjb2xvciA9ICJOYWNpbWllbnRvcyIpKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gZGVhdGhzLCBjb2xvciA9ICJNdWVydGVzIikpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJOYWNpbWllbnRvcyIsIHNlYy5heGlzID0gc2VjX2F4aXMofiAuICogMC4xLCBuYW1lID0gIk11ZXJ0ZXMiKSkgKwogIGxhYnModGl0bGUgPSAiTmFjaW1pZW50b3MgeSBtdWVydGVzIGVuIGxhIENsw61uaWNhIDEiLAogICAgICAgeCA9ICJGZWNoYSIpCmBgYAojIyA0LjUgRXN0YWJsZXpjYSBjb2xvciB2ZXJkZSBhbCBjb21wb3J0YW1pZW50byBkZSBsYSB2YXJpYWJsZSBiaXJ0aHMgeSBuYXJhbmphIHBhcmEgZGVhdGhzLiAKYGBge3J9CmdncGxvdChkZWF0aHNfY2xpbmljMSwgYWVzKHggPSBkYXRlKSkgKwogIGdlb21fbGluZShhZXMoeSA9IGJpcnRocywgY29sb3IgPSAiTmFjaW1pZW50b3MiKSkgKwogIGdlb21fbGluZShhZXMoeSA9IGRlYXRocywgY29sb3IgPSAiTXVlcnRlcyIpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiTmFjaW1pZW50b3MiLCBzZWMuYXhpcyA9IHNlY19heGlzKH4gLiAqIDAuMSwgbmFtZSA9ICJNdWVydGVzIikpICsKICBsYWJzKHRpdGxlID0gIk5hY2ltaWVudG9zIHkgbXVlcnRlcyBlbiBsYSBDbMOtbmljYSAxIiwKICAgICAgIHggPSAiRmVjaGEiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIk5hY2ltaWVudG9zIiA9ICJncmVlbiIsICJNdWVydGVzIiA9ICJvcmFuZ2UiKSkKYGBgCiMjIDQuNiBJbXByaW1hIGxhIGdyw6FmaWNhIHJlc3VsdGFudGUuCmBgYHtyfQpnZ3Bsb3RseShnZ3Bsb3QoZGVhdGhzX2NsaW5pYzEsIGFlcyh4ID0gZGF0ZSkpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBiaXJ0aHMsIGNvbG9yID0gIk5hY2ltaWVudG9zIikpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBkZWF0aHMsIGNvbG9yID0gIk11ZXJ0ZXMiKSkgKwogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIk5hY2ltaWVudG9zIiwgc2VjLmF4aXMgPSBzZWNfYXhpcyh+IC4gKiAwLjEsIG5hbWUgPSAiTXVlcnRlcyIpKSArCiAgbGFicyh0aXRsZSA9ICJOYWNpbWllbnRvcyB5IG11ZXJ0ZXMgZW4gbGEgQ2zDrW5pY2EgMSIsCiAgICAgICB4ID0gIkZlY2hhIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJOYWNpbWllbnRvcyIgPSAiZ3JlZW4iLCAiTXVlcnRlcyIgPSAib3JhbmdlIikpCikKYGBgCgojIyA0LjcgQ29uc3RydXlhIHVuYSBvcGluacOzbiBjb24gZWwgcmVzdWx0YWRvIGRlIGxhIGdyw6FmaWNhLgpPYnNlcnZhbmRvIGxhIGdyw6FmaWNhIGRlIG5hY2ltaWVudG9zIHkgbXVlcnRlcyBzZSBwdWVkZSBvYnNlcnZhciBxdWUgYSBwYXJ0aXIgZGVsIGHDsW8gMTg0NyBsYSBwcm9wb3JjacOzbiBkZSBtdWVydGVzIGRpc21pbnV5ZSBkZSBtYW5lcmEgc2lnbmlmaWNhdGl2YSwgZXN0byBkZWJpZG8gYSBxdWUgc2UgaGl6byBvYmxpZ2F0b3JpbyBlbCBsYXZhZG8gZGUgbWFub3MgZW4gbGEgQ2zDrW5pY2EgMS4gQWRlbWFzIHNlIHB1ZWRlIG9ic2VydmFyIHF1ZSBsYSBwcm9wb3JjacOzbiBkZSBuYWNpbWllbnRvcyBzZSBtYW50aWVuZSBjb25zdGFudGUgYSBsbyBsYXJnbyBkZWwgdGllbXBvLgoKIyA1IEVsIGVmZWN0byBkZWwgbGF2YWRvIGRlIG1hbm9zLiBBbmFsaWNlbW9zIGxhIHByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMgYSBsbyBsYXJnbyBkZWwgdGllbXBvLgoKUGVyc3BlY3RpdmEgbGluZWFsCiMjIDUuMSBBZ3JlZ3VlIHVuYSBudWV2YSBjb2x1bW5hIGEgbGEgdmFyaWFibGUgY3JlYWRhIGVuIGVsIGluY2lzbyA0LjEuIApFc3RhIG51ZXZhIGNvbHVtbmEgc2UgY2FsY3VsYXLDoSBjb21vIGxhIHByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMgcG9yIG7Dum1lcm8gZGUgbmFjaW1pZW50b3MuIEd1YXJkZSBlc3RlIGNhbWJpbyBlbiB1bmEgbnVldmEgdmFyaWFibGUuCmBgYHtyfQpkZWF0aHNfY2xpbmljMSA8LSBkZWF0aHNfY2xpbmljMSAlPiUKICBtdXRhdGUocHJvcG9ydGlvbl9kZWF0aHMgPSBkZWF0aHMgLyBiaXJ0aHMpCmBgYAoKCiMjIDUuMiBJbXByaW1hIGxhcyBwcmltZXJhcyBmaWxhcyBkZWwgZGF0YWZyYW1lIGRlbCBwdW50byBhbnRlcmlvci4gSGFnYSB1c28gZGUgbGEgZnVuY2nDs24gaGVhZCgpCmBgYHtyfQpoZWFkKGRlYXRoc19jbGluaWMxKQpgYGAKCiMjIDUuMyBFbGFib3JlIHVuYSBncsOhZmljYSBsaW5lYWwgdXRpbGl6YW5kbyBsYSBjb2x1bW5hIGNyZWFkYSBlbiBlbCBpbmNpY28gNS4xIChlamUgeSkgdmVyc3VzIGxhIGNvbHVubWEgZGF0ZSAoZWplIHgpLgoKYGBge3J9CmdncGxvdChkZWF0aHNfY2xpbmljMSwgYWVzKHggPSBkYXRlLCB5ID0gcHJvcG9ydGlvbl9kZWF0aHMpKSArCiAgZ2VvbV9saW5lKCkKYGBgCgojIyA1LjQgVXRpbGljZSBsYSBmdW5jaW9uIGxhYnMgcGFyYSBkYXIgYWwgZWplIHggeSBhbCBlamUgeSB1bmEgZXN0w6l0aWNhIGEgbGFzIGV0aXF1ZXRhcy4KYGBge3J9CmdncGxvdChkZWF0aHNfY2xpbmljMSwgYWVzKHggPSBkYXRlLCB5ID0gcHJvcG9ydGlvbl9kZWF0aHMpKSArCiAgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAiUHJvcG9yY2nDs24gZGUgbXVlcnRlcyBlbiBsYSBDbMOtbmljYSAxIiwKICAgICAgIHggPSAiRmVjaGEiLAogICAgICAgeSA9ICJQcm9wb3JjacOzbiBkZSBtdWVydGVzIikKYGBgCiMjIDUuNSBQb3Igw7psdGltbywgaW1wcmltYSBsYSBncsOhZmljYSB5IGNvbmNsdXlhLgpgYGB7cn0KZ2dwbG90bHkoZ2dwbG90KGRlYXRoc19jbGluaWMxLCBhZXMoeCA9IGRhdGUsIHkgPSBwcm9wb3J0aW9uX2RlYXRocykpICsKICBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICJQcm9wb3JjacOzbiBkZSBtdWVydGVzIGVuIGxhIENsw61uaWNhIDEiLAogICAgICAgeCA9ICJGZWNoYSIsCiAgICAgICB5ID0gIlByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMiKQopCmBgYAoKT2JzZXJ2YWNpb25lcwotIExhIHByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMgZW4gbGEgQ2zDrW5pY2EgMSBkaXNtaW51eWUgZGUgbWFuZXJhIHNpZ25pZmljYXRpdmEgYSBwYXJ0aXIgZGVsIGHDsW8gMTg0NywgZXN0byBkZWJpZG8gYSBxdWUgc2UgaGl6byBvYmxpZ2F0b3JpbyBlbCBsYXZhZG8gZGUgbWFub3MuCiMjIDUuNiBVc2UgZ3JvdXBfYnkgcGFyYSBsYSB2YXJpYWJsZSB5ZWFyIHkgc3VtbWFyaXNlIHBhcmEgZW5jb250cmFyIGxhIG1lZGlhIHRvbWFuZG8gZGUgcmVmZXJlbmNpYSBsYSB2YXJpYWJsZSBkZWwgaW5jaXNvIDUuMS4gR3VhcmRlIGVsIHJlc3VsdGFkbyBlbiB1bmEgbnVldmEgdmFyaWFibGUuCgpgYGB7cn0KZGVhdGhzX2NsaW5pYzEkeWVhciA8LSB5ZWFyKGRlYXRoc19jbGluaWMxJGRhdGUpCmRlYXRoc19jbGluaWMxX3llYXJseSA8LSBkZWF0aHNfY2xpbmljMSAlPiUKICBncm91cF9ieSh5ZWFyKSAlPiUKICBzdW1tYXJpc2UobWVhbl9wcm9wb3J0aW9uX2RlYXRocyA9IG1lYW4ocHJvcG9ydGlvbl9kZWF0aHMpKQpgYGAKCiMjIDUuNyBVdGlsaWNlIGxhIHZhcmlhYmxlIGNyZWFkYSBlbiBlbCBpbmNpc28gYW50ZXJpb3IgcGFyYSBjcmVhciB1biBncsOhZmljbyBkZSBiYXJyYXMgcXVlIG11ZXN0cmUgbGEgbWVkaWEgZW4gY2FkYSBhw7FvLgoKYGBge3J9CmdncGxvdChkZWF0aHNfY2xpbmljMV95ZWFybHksIGFlcyh4ID0geWVhciwgeSA9IG1lYW5fcHJvcG9ydGlvbl9kZWF0aHMpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpCmBgYAoKIyMgNS44IFBvciDDumx0aW1vLCBpbXByaW1hIGxhIGdyYWZpY2EgeSBjb25jbHV5YS4KYGBge3J9CmdncGxvdGx5KGdncGxvdChkZWF0aHNfY2xpbmljMV95ZWFybHksIGFlcyh4ID0geWVhciwgeSA9IG1lYW5fcHJvcG9ydGlvbl9kZWF0aHMpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICBsYWJzKHRpdGxlID0gIlByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMgcHJvbWVkaW8gZW4gbGEgQ2zDrW5pY2EgMSIsCiAgICAgICB4ID0gIkHDsW8iLAogICAgICAgeSA9ICJQcm9wb3JjacOzbiBkZSBtdWVydGVzIHByb21lZGlvIikKKQpgYGAKIyBDb25jbHVzaW9uZXMKLSBFbCBwcm9tZWRpbyBkZSBtdWVydGVzIGVuIGxhIENsw61uaWNhIDEgZGlzbWludXllIGRlIG1hbmVyYSBzaWduaWZpY2F0aXZhIGEgcGFydGlyIGRlbCBhw7FvIDE4NDcsIGVzdG8gZGViaWRvIGEgcXVlIHNlIGhpem8gb2JsaWdhdG9yaW8gZWwgbGF2YWRvIGRlIG1hbm9zLgoKIyA2IExvcyByZXN1bHRhZG9zIGRlbCBsYXZhZG8gZGUgbWFub3MKCkEgcGFydGlyIGRlbCBhw7FvIDE4NDcgbGEgcHJvcG9yY2nDs24gZGUgbXVlcnRlcyBzZSByZWR1Y2UgZHLDoXN0aWNhbWVudGUgeSwgc8OtLCBmdWUgZW50b25jZXMgY3VhbmRvIHNlIGhpem8gb2JsaWdhdG9yaW8gZWwgbGF2YWRvIGRlIG1hbm9zLgpFbCBlZmVjdG8gZGVsIGxhdmFkbyBkZSBtYW5vcyBzZSBoYWNlIGHDum4gbcOhcyBjbGFybyBzaSBsbyByZXNhbHRhbW9zIGVuIGVsIGdyw6FmaWNvLgoKIyA2LjEgQWdyZWd1ZSB1bmEgY29sdW1uYSBhIGxhIHZhcmlhYmxlIGNyZWFkYSBlbiBlbCBpbmNpc28gNS4xLCBlc3TDoSBjb2x1bW5hIHNlcsOhIFRSVUUgYSBwYXJ0aXIgZGVsIGHDsW8gZW4gcXVlIHNlIGltcHVzbyBlbCBsYXZhZG8gZGUgbWFub3MgeSBGQUxTRSBwYXJhIGHDsW9zIGFudGVyaW9yZXMuIEd1YXJkZSBlc3RlIGNhbWJpbyBlbiB1bmEgbnVldmEgdmFyaWFibGUuCmBgYHtyfQpkZWF0aHNfY2xpbmljMSA8LSBkZWF0aHNfY2xpbmljMSAlPiUKICBtdXRhdGUoaGFuZHdhc2hpbmdfc3RhcnRlZCA9IGRhdGUgPj0gIjE4NDctMDEtMDEiKQpgYGAKCiMjIDYuMiBDb25zdHJ1eWEgdW5hIGdyw6FmaWNhIGxpbmVhbCB0b21hbmRvIGRlIHJlZmVyZW5jaWEgbGEgdmFyaWFibGUgY29uIGxhIHByb3BvcmNpw7NuIChtdWVydGVzL25hY2ltaWVudG9zKSBwYXJhIGVsIGVqZSB5IHZlcnN1cyBsYSB2YXJpYWJsZSBkYXRlIHBhcmEgZWwgZWplIHguIEhhZ2EgcXVlIGVsIGNvbG9yIGRlIGxhIGxpbmVhIGRlcGVuZGEgZGUgbGEgY29sdW1uYSBjcmVhZGEgZW4gZWwgaW5jaXNvIDYuMQpgYGB7cn0KZ2dwbG90KGRlYXRoc19jbGluaWMxLCBhZXMoeCA9IGRhdGUsIHkgPSBwcm9wb3J0aW9uX2RlYXRocywgY29sb3IgPSBoYW5kd2FzaGluZ19zdGFydGVkKSkgKwogIGdlb21fbGluZSgpCmBgYAojIyA2LjMgVXRpbGljZSBsYSBmdW5jacOzbiBsYWJzIHBhcmEgZGFyIGFsIGVqZSB4IHkgYWwgZWplIHkgdW5hIGVzdMOpdGljYSBhIGxhcyBldGlxdWV0YXMuCmBgYHtyfQpnZ3Bsb3QoZGVhdGhzX2NsaW5pYzEsIGFlcyh4ID0gZGF0ZSwgeSA9IHByb3BvcnRpb25fZGVhdGhzLCBjb2xvciA9IGhhbmR3YXNoaW5nX3N0YXJ0ZWQpKSArCiAgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAiUHJvcG9yY2nDs24gZGUgbXVlcnRlcyBlbiBsYSBDbMOtbmljYSAxIiwKICAgICAgIHggPSAiRmVjaGEiLAogICAgICAgeSA9ICJQcm9wb3JjacOzbiBkZSBtdWVydGVzIikKYGBgCiMjIDYuNCBJbXByaW1hIGxhIGdyw6FmaWNhIHkgY29uY2x1eWEKYGBge3J9CmdncGxvdGx5KGdncGxvdChkZWF0aHNfY2xpbmljMSwgYWVzKHggPSBkYXRlLCB5ID0gcHJvcG9ydGlvbl9kZWF0aHMsIGNvbG9yID0gaGFuZHdhc2hpbmdfc3RhcnRlZCkpICsKICBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICJQcm9wb3JjacOzbiBkZSBtdWVydGVzIGVuIGxhIENsw61uaWNhIDEiLAogICAgICAgeCA9ICJGZWNoYSIsCiAgICAgICB5ID0gIlByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMiKSkKYGBgCiMgNyDCv03DoXMgbGF2YWRvIGRlIG1hbm9zLCBtZW5vcyBtdWVydGVzPwoKTnVldmFtZW50ZSwgbGFzIGVzdGFkw61zdGljYXMgbXVlc3RyYW4gcXVlIGxhdmFyc2UgbGFzIG1hbm9zIHR1dm8gdW4gZWZlY3RvIGVub3JtZS4gwr9DdcOhbnRvIHJlZHVqbyBsYSBwcm9wb3JjacOzbiBtZW5zdWFsIGRlIG11ZXJ0ZXMgZW4gcHJvbWVkaW8/CgojIyA3LjEgVG9tZSBkZSByZWZlcmVuY2lhIGxhIGNvbHVtbmEgcXVlIHNlIGFncmVnw7MgZW4gZWwgaW5jaXNvIDYuMSB5IHV0aWxpY2UgbGEgZnVuY2nDs24gZ3JvdWJfYnkgcGFyYSBjcmVhciB1biBhZ3J1cGFtaWVudG8uCgpgYGB7cn0KZGVhdGhzX2NsaW5pYzEkbW9udGggPC0gbW9udGgoZGVhdGhzX2NsaW5pYzEkZGF0ZSkKbW9udGhseSA8LSBkZWF0aHNfY2xpbmljMSAlPiUKICBncm91cF9ieShoYW5kd2FzaGluZ19zdGFydGVkLCB5ZWFyKGRhdGUpLCBtb250aChkYXRlKSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fcHJvcG9ydGlvbl9kZWF0aHMgPSBtZWFuKHByb3BvcnRpb25fZGVhdGhzKSkKYGBgCiMjIDcuMiBFbiBjb250aW51aWRhZCBhbCBpbmNpc28gYW50ZXJpb3IsIGFwbGlxdWUgc3VtbWFyaXNlIHBhcmEgY2FsY3VsYXIgZWwgcHJvbWVkaW8gZGUgbGEgcHJvcG9yY2nDs24gZGUgbXVlcnRlcyBhbnRlcyB5IGRlc3B1w6lzIGRlIHF1ZSBzZSBpbXB1c2llcmEgZWwgbGF2YWRvIGRlIG1hbm9zLiBUb21lIGRlIHJlZmVyZW5jaWEgbGEgdmFyaWFibGUgY29uIGxhIHByb3BvcmNpw7NuIChtdWVydGVzL25hY2ltaWVudG9zKS4KYGBge3J9Cm1vbnRobHlfc3VtbWFyeSA8LSBtb250aGx5ICU+JQogIGdyb3VwX2J5KGhhbmR3YXNoaW5nX3N0YXJ0ZWQpICU+JQogIHN1bW1hcmlzZShtZWFuX3Byb3BvcnRpb25fZGVhdGhzID0gbWVhbihtZWFuX3Byb3BvcnRpb25fZGVhdGhzKSkKYGBgCgojIyA3LjMgQXNpZ25lIGVsIHJlc3VsdGFkbyBhIHVuYSBudWV2YSB2YXJpYWJsZSBlIGltcHLDrW1hbGEuIAoKYGBge3J9Cm1vbnRobHlfc3VtbWFyeQpgYGAKIyMgNy40IFV0bGljZSBnZ3Bsb3QgcGFyYSBjcmVhciB1biBib3hwbG90IHF1ZSB0b21lIGRlIHJlZmVyZW5jaWEgbGEgY29sdW1uYSBjcmVhZGEgZW4gZWwgaW5jaXNvIDYuMSAoZWplIHgpIHZlcnN1cyBsYSB2YXJpYWJsZSBkZSBwcm9wb3JjacOzbiAobXVlcnRlcy9uYWNpbWllbnRvcykuCmBgYHtyfQpnZ3Bsb3QobW9udGhseSwgYWVzKHggPSBoYW5kd2FzaGluZ19zdGFydGVkLCB5ID0gbWVhbl9wcm9wb3J0aW9uX2RlYXRocykpICsKICBnZW9tX2JveHBsb3QoKQpgYGAKCiMjIDcuNSBJbXByaW1hIGxhIGdyw6FmaWNhIHkgY29uY2x1eWEgZW4gZnVuY2nDs24gZGUgbG9zIGluY2lzb3MgNy4zIHkgNy40LgpgYGB7cn0KZ2dwbG90KG1vbnRobHksIGFlcyh4ID0gaGFuZHdhc2hpbmdfc3RhcnRlZCwgeSA9IG1lYW5fcHJvcG9ydGlvbl9kZWF0aHMpKSArCiAgZ2VvbV9ib3hwbG90KCkKYGBgCiMgOCBBbsOhbGlzaXMgZXN0YWTDrXN0aWNvIGRlIGxvcyBkYXRvcyBkZSBsYXZhZG8gZGUgbWFub3MKCgrCoVJlZHVqbyBsYSBwcm9wb3JjacOzbiBkZSBtdWVydGVzIGVuIGFscmVkZWRvciBkZSA4IHB1bnRvcyBwb3JjZW50dWFsZXMhIERlbCAxMCUgZW4gcHJvbWVkaW8gYW50ZXMgZGVsIGxhdmFkbyBkZSBtYW5vcyBhIHNvbG8gZWwgMiUgY3VhbmRvIHNlIGhpem8gY3VtcGxpciBlbCBsYXZhZG8gZGUgbWFub3MgKHF1ZSBzaWd1ZSBzaWVuZG8gdW4gbsO6bWVybyBhbHRvIHNlZ8O6biBsb3MgZXN0w6FuZGFyZXMgbW9kZXJub3MpLiBQYXJhIHRlbmVyIHVuYSBpZGVhIGRlIGxhIGluY2VydGlkdW1icmUgZW4gdG9ybm8gYSBjdcOhbnRvIHNlIHJlZHVjZSBsYSBtb3J0YWxpZGFkIHBvciBsYXZhcnNlIGxhcyBtYW5vcywgcG9kcsOtYW1vcyBvYnNlcnZhciB1biBpbnRlcnZhbG8gZGUgY29uZmlhbnphIChhcXXDrSBjYWxjdWxhZG8gbWVkaWFudGUgdW5hIHBydWViYSB0KS4KClV0aWxpY2UgbGEgZnVuY2nDs24gdC50ZXN0IHBhcmEgY2FsY3VsYXIgdW4gaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBkZWwgOTUlLiBMb3MgZG9zIGdydXBvcyBxdWUgdGVuZW1vcyBzb24gcHJvcG9yY2nDs24gbWVuc3VhbCBkZSBtdWVydGVzIGFudGVzIHkgZGVzcHXDqXMgZGUgcXVlIGNvbWVuemFyYSBlbCBsYXZhZG8gZGUgbWFub3MuIFRvbWUgZGUgcmVmZXJlbmNpYSBsYSBjb2x1bW5hIGNvbiBsYSBwcm9wb3JjacOzbiAobXVlcnRlcy9uYWNpbWllbnRvcykgeSBsYSBjb2x1bW5hIGNyZWFkYSBlbiBlbCBpbmNpc28gNi4xLgpgYGB7cn0KdC50ZXN0KG1vbnRobHkkbWVhbl9wcm9wb3J0aW9uX2RlYXRocyB+IG1vbnRobHkkaGFuZHdhc2hpbmdfc3RhcnRlZCkKYGBgCiMgQ29uY2x1c2lvbmVzCi0gRWwgbGF2YWRvIGRlIG1hbm9zIHJlZHVqbyBsYSBwcm9wb3JjacOzbiBkZSBtdWVydGVzIGVuIGFscmVkZWRvciBkZSA4IHB1bnRvcyBwb3JjZW50dWFsZXMsIGRlbCAxMCUgZW4gcHJvbWVkaW8gYW50ZXMgZGVsIGxhdmFkbyBkZSBtYW5vcyBhIHNvbG8gZWwgMiUgY3VhbmRvIHNlIGhpem8gY3VtcGxpciBlbCBsYXZhZG8gZGUgbWFub3MuCi0gRWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBkZWwgOTUlIHBhcmEgbGEgZGlmZXJlbmNpYSBlbiBsYSBwcm9wb3JjacOzbiBkZSBtdWVydGVzIGFudGVzIHkgZGVzcHXDqXMgZGVsIGxhdmFkbyBkZSBtYW5vcyBlcyBkZSAtMC4wNjcgYSAtMC4wMzMuIExvIGN1YWwgaW5kaWNhIHF1ZSBlbCBsYXZhZG8gZGUgbWFub3MgcmVkdWpvIGxhIHByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMgZW4gdW4gNi43JSBhIDMuMyUuCi0gQSBwZXNhciBkZSBxdWUgbGEgcHJvcG9yY2nDs24gZGUgbXVlcnRlcyBkaXNtaW51ecOzIGRlIG1hbmVyYSBzaWduaWZpY2F0aXZhLCBlbCAyJSBkZSBtdWVydGVzIHNpZ3VlIHNpZW5kbyB1biBuw7ptZXJvIGFsdG8gc2Vnw7puIGxvcyBlc3TDoW5kYXJlcyBtb2Rlcm5vcy4KLSBFbCBsYXZhZG8gZGUgbWFub3MgZXMgdW5hIGRlIGxhcyBtZWRpZGFzIG3DoXMgZWZlY3RpdmFzIHBhcmEgcHJldmVuaXIgbGEgcHJvcGFnYWNpw7NuIGRlIGVuZmVybWVkYWRlcyBpbmZlY2Npb3Nhcy4KCiMgOSBBbsOhbGlzaXMgZXN0YWTDrXN0aWNvIHByb3BpbwoKIyMgOS4xIEFwbGlxdWUgZnVuY2lvbmVzIGNvbW8gZmlsdGVyLCBjb3VudCwgc2VsZWN0IG8gdmlzdWFsaXphY2lvbmVzIGRlIHRpcG8gaGlzdG9ncmFtYSBvIGdyw6FmaWNhIGRlIHB1bnRvcywgcXVlIGxlIHBlcm1pdGFuIGRlc2N1YnJpciBjb21wb3J0YW1pZW50b3MgbyB0ZW5kZW5jaWFzIGVuIGxvcyBkYXRvcy4gTm8gc2UgbGltaXRlIGEgZXN0YXMgc3VnZXJlbmNpYSwgcHVlZGUgYXBsY2lhciBjdWFscXVpZXIgb3RybyB0aXBvIGRlIGZ1bmNpw7NuLgojIyA5LjIgUGFyYSBjYWRhIGFuw6FsaXNpcyBlc3RhZMOtc3RpY28gcXVlIHByb3BvcmNpb25lIGNvbmNsdXlhIGVuIGZ1bmNpw7NuIGRlIGxvcyByZXN1bHRhZG9zIG9idGVuaWRvcy4KCiMjIE1lZGlhIGRlIG11ZXJ0ZXMgZW4gbGEgQ2zDrW5pY2EgMSBhbnRlcyBkZWwgbGF2YWRvIGRlIG1hbm9zCmBgYHtyfQpkZWF0aHNfY2xpbmljMSAlPiUKICBmaWx0ZXIoaGFuZHdhc2hpbmdfc3RhcnRlZCA9PSBGQUxTRSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fZGVhdGhzID0gbWVhbihkZWF0aHMpKQpgYGAKIyMgTWVkaWEgZGUgbXVlcnRlcyBlbiBsYSBDbMOtbmljYSAxIGRlc3B1w6lzIGRlbCBsYXZhZG8gZGUgbWFub3MKYGBge3J9CmRlYXRoc19jbGluaWMxICU+JQogIGZpbHRlcihoYW5kd2FzaGluZ19zdGFydGVkID09IFRSVUUpICU+JQogIHN1bW1hcmlzZShtZWFuX2RlYXRocyA9IG1lYW4oZGVhdGhzKSkKYGBgCiMjIyBDb25jbHVzaW9uZXMKLSBMYSBtZWRpYSBkZSBtdWVydGVzIGVuIGxhIENsw61uaWNhIDEgYW50ZXMgZGVsIGxhdmFkbyBkZSBtYW5vcyBlcyBkZSAxMC41LgotIExhIG1lZGlhIGRlIG11ZXJ0ZXMgZW4gbGEgQ2zDrW5pY2EgMSBkZXNwdcOpcyBkZWwgbGF2YWRvIGRlIG1hbm9zIGVzIGRlIDIuMS4KLSBFbCBsYXZhZG8gZGUgbWFub3MgcmVkdWpvIGxhIG1lZGlhIGRlIG11ZXJ0ZXMgZW4gbGEgQ2zDrW5pY2EgMSBlbiA4LjQuCi0gTGEgbWVkaWEgZGUgbXVlcnRlcyBlbiBsYSBDbMOtbmljYSAxIGRlc3B1w6lzIGRlbCBsYXZhZG8gZGUgbWFub3MgZXMgbXVjaG8gbcOhcyBiYWphIHF1ZSBhbnRlcyBkZWwgbGF2YWRvIGRlIG1hbm9zLgoKIyBSZWdyZXNpw7NuIGxpbmVhbCBwYXJhIHByZWRlY2lyIGxhIHByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMgZW4gbGEgQ2zDrW5pY2EgMSBzaSBubyBzZSBodWJpZXJhIGltcGxlbWVudGFkbyBlbCBsYXZhZG8gZGUgbWFub3MuCgpgYGB7cn0KZGVhdGhzX2NsaW5pYzFfYmVmb3JlIDwtIGRlYXRoc19jbGluaWMxICU+JQogIGZpbHRlcihkYXRlIDwgIjE4NDctMDEtMDEiKQoKbG0oZGVhdGhzX2NsaW5pYzFfYmVmb3JlJHByb3BvcnRpb25fZGVhdGhzIH4gZGVhdGhzX2NsaW5pYzFfYmVmb3JlJGhhbmR3YXNoaW5nX3N0YXJ0ZWQpCmBgYAojIyBHcmFmaWNhIGRlbCBtb2RlbG8gZGUgcmVncmVzaW9uIGxpbmVhbCBwYXJhIHByZWRlY2lyIGxhIHByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMgZW4gbGEgQ2zDrW5pY2EgMSBzaSBubyBzZSBodWJpZXJhIGltcGxlbWVudGFkbyBlbCBsYXZhZG8gZGUgbWFub3MuCgpgYGB7cn0KZ2dwbG90KGRlYXRoc19jbGluaWMxX2JlZm9yZSwgYWVzKHggPSBkYXRlLCB5ID0gcHJvcG9ydGlvbl9kZWF0aHMpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFKQpgYGAKIyMjIENvbmNsdXNpw7NuCi0gRWwgbW9kZWxvIGluZGljYSBxdWUgc2kgbm8gc2UgaHViaWVyYSBpbXBsZW1lbnRhZG8gZWwgbGF2YWRvIGRlIG1hbm9zIG9ibGlnYXRvcmlvIGxhIHByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMgaHViaWVyYSBpZG8gZW4gYXVtZW50by4KCiMgTW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsIHBhcmEgcHJlZGVjaXIgbGEgcHJvcG9yY2lvbiBkZSBtdWVydGVzIGRlc3B1ZXMgZGUgaW1wbGVtZW50YXIgZWwgbGF2YWRvIGRlIG1hbm9zLgoKYGBge3J9CmRlYXRoc19jbGluaWMxX2FmdGVyIDwtIGRlYXRoc19jbGluaWMxICU+JQogIGZpbHRlcihkYXRlID49ICIxODQ3LTAxLTAxIikKCmxtKGRlYXRoc19jbGluaWMxX2FmdGVyJHByb3BvcnRpb25fZGVhdGhzIH4gZGVhdGhzX2NsaW5pYzFfYWZ0ZXIkaGFuZHdhc2hpbmdfc3RhcnRlZCkKYGBgCgojIyBHcmFmaWNhIGVsIG1vZGVsbyBkZSByZWdyZXNpw7NuIGxpbmVhbCBwYXJhIHByZWRlY2lyIGxhIHByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMgZW4gbGEgQ2zDrW5pY2EgMSBkZXNwdcOpcyBkZWwgbGF2YWRvIGRlIG1hbm9zLgpgYGB7cn0KZ2dwbG90KGRlYXRoc19jbGluaWMxX2FmdGVyLCBhZXMoeCA9IGRhdGUsIHkgPSBwcm9wb3J0aW9uX2RlYXRocykpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpCmBgYAojIyMgQ29uY2x1c2lvbmVzCi0gRWwgbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsIHBhcmEgcHJlZGVjaXIgbGEgcHJvcG9yY2nDs24gZGUgbXVlcnRlcyBkZXNwdcOpcyBkZWwgbGF2YWRvIGRlIG1hbm9zIGEgcGFydGlyIGRlbCBhw7FvIDE4NDcgaW5kaWNhIHF1ZSBsYSBwcm9wb3JjacOzbiBkZSBtdWVydGVzIGRpc21pbnV5w7MgZGUgbWFuZXJhIHNpZ25pZmljYXRpdmEgeSBzZWd1aXLDoSBkaXNtaW51eWVuZG8gZW4gZWwgZnV0dXJvLgoKIyBHcsOhZmljYSBkZSBwdW50b3MgcGFyYSBjb21wYXJhciBsYSBwcm9wb3JjacOzbiBkZSBtdWVydGVzIGVuIGxhIENsw61uaWNhIDEgYW50ZXMgeSBkZXNwdcOpcyBkZWwgbGF2YWRvIGRlIG1hbm9zCmBgYHtyfQpnZ3Bsb3QoZGVhdGhzX2NsaW5pYzEsIGFlcyh4ID0gZGF0ZSwgeSA9IHByb3BvcnRpb25fZGVhdGhzLCBjb2xvciA9IGhhbmR3YXNoaW5nX3N0YXJ0ZWQpKSArCiAgZ2VvbV9wb2ludCgpCmBgYAoKR3LDoWZpY2EgZGUgZmFjZXRfd3JhcCBwYXJhIGNvbXBhcmFyIGxhIHByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMgZW4gbGEgQ2zDrW5pY2EgMSBhbnRlcyB5IGRlc3B1w6lzIGRlbCBsYXZhZG8gZGUgbWFub3MKYGBge3J9CmdncGxvdGx5KGdncGxvdChkZWF0aHNfY2xpbmljMSwgYWVzKHggPSBkYXRlLCB5ID0gcHJvcG9ydGlvbl9kZWF0aHMpKSArCiAgZ2VvbV9saW5lKCkgKwogIGZhY2V0X3dyYXAofiBoYW5kd2FzaGluZ19zdGFydGVkKSsKICBsYWJzKHRpdGxlID0gIlByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMgZW4gbGEgQ2zDrW5pY2EgMSIsCiAgICAgICB4ID0gIkZlY2hhIiwKICAgICAgIHkgPSAiUHJvcG9yY2nDs24gZGUgbXVlcnRlcyIpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikpCmBgYA==